#ifndef __KEYFLOW_SHUANGPIN_H__
#define __KEYFLOW_SHUANGPIN_H__

#include <map>
#include <string>
#include <vector>

#ifndef DEFAULT_SHUANGPIN_SCHEMA
#define DEFAULT_SHUANGPIN_SCHEMA "[metadata]\ntitle=国标双拼\n\n[声母]\nsh=U\nzh=V\nch=I\n\n[韵母]\nia=Q\nua=Q\nuan=W\nvan=W\nen=R\nie=T\niu=Y\nuai=Y\nuo=O\nou=P\niong=S\nong=S\nian=D\nan=F\nang=G\neng=H\ning=J\nai=K\nin=L\ner=L\nvn=Z\nun=Z\nve=X\nao=C\nv=V\nui=V\nei=B\niang=N\nuang=N\niao=M\n\n[零声母音节的韵母]\na=AA\nai=AK\nan=AF\nang=AG\nao=AC\ne=AE\nei=AB\ner=AL\nen=AR\neng=AH\no=AO\nou=AP\n"
#endif

namespace cpis
{
	namespace keyflow
	{
		struct ShuangPinMap // 用于存储双拼到全拼的映射配置
		{
			std::map<char, std::string> smap;			   // smap: 声母映射表: 'V' -> "zh"
			std::map<char, std::vector<std::string> > ymap; // ymap: 韵母映射表: 'M' -> "ian", "uan"
			std::map<std::string, std::string> osmap;	   // osmap: 零声母拼音映射表: "OA" -> "a"
		};

		struct FullPinYin // 解码后的返回值
		{
			std::string fpy; // 完整的(包括历史解码)解码后的拼音串
			std::string py;	 // 本次解码得到的拼音串(传递给拼音引擎)
            std::string comp;
		};

		struct PinYinNode;

		// 从Ini文件加载双拼映射
		//@ret: 传递给Init接口进行初始化。

		ShuangPinMap LoadShuangPinMapByString(const char *type, const char *content);
		ShuangPinMap LoadDefaultShuangPinMapByString(const char *content);
		ShuangPinMap LoadSogouShuangPinMapByString(const char *content);

		ShuangPinMap LoadShuangPinMapByFilePath(const char *type, const char *filename);
		ShuangPinMap LoadDefaultShuangPinMapByFilePath(const char *filename);
		ShuangPinMap LoadSogouShuangPinMapByFilePath(const char *filename);

		class CShuangPin
		{
		public:
			CShuangPin();
			virtual ~CShuangPin();

			virtual int32_t Init(const ShuangPinMap &spmap, bool enable_fullpinyin = true);

			// 解码双拼串,支持混合全拼
			virtual const std::string &Decode(const std::string &sp);

			// 判断字符c是否为合法的双拼或者全拼输入
			inline bool CheckInput(int32_t c) const { return 0 < c && c < 128 && _valid_key_table[c]; }

			// sp: 返回完整拼串
			inline const std::string &GetFullPinYin() const { return _full_pinyin.fpy; }

			// sp: 返回增量拼串
			inline const std::string &GetLastPinYin() const { return _full_pinyin.py; }

			// sp: 返回comp
			inline const std::string &GetComposition() const { return _full_pinyin.comp; }

			// 重置输入状态: 清空历史输入
			virtual void Clear();

		private:
			inline const char *DecodeSingleSP(char s, char y)
			{
				return _full_pinyin_table[s][y];
			}

			void SearchPinYin(const char *c);
			void DecodeSP(std::string &isp);
			void DecodeMix(std::string &isp);

		private:
			const char *_full_pinyin_table[128][128]; //双拼->全拼映射表

			bool _enable_fullpinyin; //是否启用全拼
			bool _valid_key_table[128]; //有效按键

			int32_t _input_status; //输入状态
			int32_t _pending_len; // 未决输入长度
			int32_t _valid_pylen; // 最长有效拼音长度

			PinYinNode *_cur_pynode; //当前全拼搜索节点
			FullPinYin _full_pinyin;
		};
	}
}

#endif
